特点
- 拷贝构造函数名字与类名相同,并且不能指定返回类型.
- 拷贝构造函数只能有一个参数,并且该参数是该类的对象的引用.
- 它不能被显式调用,在以下三种情况下会被自动调用: - 用一个类的对象去初始化该类的另一个对象时 - 1 
 2
 3
 4
 5
 6
 7- Point p1(3, 4); 
 Point p2 = p1;
 //注意,这种情况下不会调用拷贝构造函数:
 Point p1(3, 4);
 Point p2;
 p2 = p1;
- 当函数的形参是类的对象,进行形参和实参结合时??? - 1 
 2
 3
 4- Point func(Point p); //有一个函数的形参是类的对象 
 ....
 p2 = func(p1); //p1, p2 都是对象.
 //当用 p1 初始化形参 p 时调用拷贝构造函数
- 当函数的返回值是类的对象,函数执行完成进行返回时 - 1 
 2
 3- Point p; 
 ...
 return p;
 
作用
用一个已经存在的对象去初始化另一个对象,为了保证引用的对象不被修改,通常把引用参数声明为 const 参数(这样引用就相当于一个常量). 格式如下:1
2
3
4<类名>::<类名>(const <类名> & <对象名>)
{
    <函数体>
}
| 1 | Point::Point(const Point & p) | 
使用
如果没有定义拷贝构造函数, 本身应该是有的. 比如在函数传递的时候, 形参拷贝了实参的数据. (因为定义了拷贝构造函数但是里面什么也没做的话, 发现形参里的对象的数据成员是垃圾值. )
所以如果定义了拷贝构造函数至少要进行数据的拷贝.
| 1 | //在类的声明中 |